package com.bl.andr.utillib.time;

import java.util.Calendar;
import java.util.Date;

///////////////////////////////////////////////////////////////////////////
// Calendar日期处理类: 用来处理日期的设值，获取相应的年，月，日。
// 通过传入Date对象，获取想要的相关数据，或者获得用Calendar处理后，想要的数据
//
// GregorianCalendar是Calendar的一个具体子类，提供了世界上大多数国家/地区使用的标准日历系统。
//
// 月份：一月是0，二月是1，以此类推，12月是11
// 星期：周日是1，周一是2，。。。。。周六是7
///////////////////////////////////////////////////////////////////////////

public class CalendarUtil {

    private CalendarUtil() {
    }


    /**
     * 获取默认的日历对象
     * 使用目前的时区和语言环境的方法得到一个日历
     */
    private static Calendar getCalendar() {
        return Calendar.getInstance();
    }

    /**
     * 给定日期，返回日历对象
     *
     * @param date 日期对象
     */
    public static Calendar getCalendar(Date date) {
        Calendar c = getCalendar();
        if (date != null) {
            c.setTime(date);
        }
        return c;
    }

    /**
     * 获取给定日历对象中的 年月日时分秒等属性
     *
     * @param c     日历对象
     * @param field 属性type   Calendar.YEAR， Calendar.MONTH，(Calendar.DAY_OF_MONTH = Calendar.DATE)
     *              Calendar.HOUR_OF_DAY,Calendar.MINUTE,Calendar.SECOND
     * @return 属性type的值
     */
    public static int getFieldValue(Calendar c, int field) {
        if (c == null) c = getCalendar();
        switch (field) {
            case Calendar.MONTH:
                return c.get(field) + 1;
        }
        return c.get(field);
    }


    /**
     * 获得当前周weekDay对应的日期
     * 注：US等每星期第一天为sunday
     *
     * @param week Calendar.SUNDAY ~ Calendar.SATURDAY
     * @return Date 对象
     */
    public static Date getWeekDayDate(int week) {
        Calendar c = getCalendar();
        c.set(Calendar.DAY_OF_WEEK, week);
        return c.getTime();
    }


    /**
     * 获得相对今天的位移天数的日期
     *
     * @param offDay 位移天数 -1 昨天 1 明天
     */
    public static Date getOffDayDate(int offDay) {
        Calendar c = getCalendar();
        c.add(Calendar.DATE, offDay);
        return c.getTime();
    }


    /**
     * @param c     Calendar 对象
     * @param field field
     * @return 最大值
     */
    public static int getMaxValue(Calendar c, int field) {
        if (c == null) c = getCalendar();
        return c.getActualMaximum(field);
    }


    /**
     * @param c     Calendar 对象
     * @param field field
     * @return 最小值
     */
    public static int getMinValue(Calendar c, int field) {
        if (c == null) c = getCalendar();
        return c.getActualMinimum(field);
    }


    /**
     * 获得相对当前月 位移月的日期
     *
     * @param offMon 位移月数
     * @return Calendar 对象
     */
    private static Calendar getOffMonth(int offMon) {
        Calendar c = getCalendar();
        c.add(Calendar.MONTH, offMon);
        return c;
    }

    /**
     * 获得相对当前月 位移月的日期
     *
     * @param offMon 位移月数
     * @return Date 对象
     */
    public static Date getOffMonthDate(int offMon) {
        Calendar c = getOffMonth(offMon);
        return c.getTime();
    }


    /**
     * 获取相对于当月 月份中第几天的日期
     *
     * @param offMonth   位移月数 0 当月，-1 上个月 1下个月 以此类推
     * @param dayOfMonth 第几天 1 第一天
     * @return Date 对象
     */
    public static Date getDayOfMonthDate(int offMonth, int dayOfMonth) {
        Calendar c = getOffMonth(offMonth);
        int days = getMaxValue(c, Calendar.DAY_OF_MONTH);
        if (dayOfMonth > 0 && dayOfMonth <= days) {
            c.set(Calendar.DAY_OF_MONTH, dayOfMonth);
        } else {
            //否则设置成第一天
            c.set(Calendar.DAY_OF_MONTH, 1);
        }
        return c.getTime();
    }


}
